Allow configuration of jobs by default via build.jobs
authorAlex Crichton <alex@alexcrichton.com>
Thu, 15 Jan 2015 08:20:56 +0000 (00:20 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Fri, 16 Jan 2015 16:45:07 +0000 (08:45 -0800)
Continuation of #1114
Closes #1108

src/cargo/ops/cargo_compile.rs
src/doc/config.md
tests/test_bad_config.rs

index d4827c37d87136942545779ff1f2afebda314c95..3e70b84c104d0d945ee79e8429ae0be062b083f5 100644 (file)
 //!       previously compiled dependency
 //!
 
-use std::os;
 use std::collections::HashMap;
 use std::default::Default;
+use std::num::ToPrimitive;
+use std::os;
 use std::sync::Arc;
 
 use core::registry::PackageRegistry;
@@ -188,8 +189,25 @@ fn source_ids_from_config(config: &Config, cur_path: Path)
 fn scrape_build_config(config: &Config,
                        jobs: Option<u32>,
                        target: Option<String>) -> CargoResult<ops::BuildConfig> {
+    let cfg_jobs = match try!(config.get_i64("build.jobs")) {
+        Some((n, p)) => {
+            match n.to_u32() {
+                Some(n) => Some(n),
+                None if n <= 0 => {
+                    return Err(human(format!("build.jobs must be positive, \
+                                              but found {} in {:?}", n, p)));
+                }
+                None => {
+                    return Err(human(format!("build.jobs is too large: \
+                                              found {} in {:?}", n, p)));
+                }
+            }
+        }
+        None => None,
+    };
+    let jobs = jobs.or(cfg_jobs).unwrap_or(os::num_cpus() as u32);
     let mut base = ops::BuildConfig {
-        jobs: jobs.unwrap_or(os::num_cpus() as u32),
+        jobs: jobs,
         requested_target: target.clone(),
         ..Default::default()
     };
index af008b1b193abcece2490e48256d98636470b164..66a48789c7735fb8150ab4f264f18646e2c5030c 100644 (file)
@@ -74,4 +74,7 @@ token = "..."   # Access token (found on the central repo's website)
 [http]
 proxy = "..."     # HTTP proxy to use for HTTP requests (defaults to none)
 timeout = 30000   # Timeout for each HTTP request, in milliseconds
+
+[build]
+jobs = 1        # number of jobs to run by default (default to # cpus)
 ```
index 3e644293c89c847e9d9ca7107172b5105c3ddea8..ad179ecd5f28a7bc3421b3c32e90349555be60d1 100644 (file)
@@ -87,3 +87,57 @@ Caused by:
 expected a string, but found a boolean in [..]config
 "));
 });
+
+
+test!(bad_cargo_config_jobs {
+    let foo = project("foo")
+    .file("Cargo.toml", r#"
+        [package]
+        name = "foo"
+        version = "0.0.0"
+        authors = []
+    "#)
+    .file("src/lib.rs", "")
+    .file(".cargo/config", r#"
+        [build]
+        jobs = -1
+    "#);
+    assert_that(foo.cargo_process("build").arg("-v"),
+                execs().with_status(101).with_stderr("\
+build.jobs must be positive, but found -1 in [..]
+"));
+});
+
+test!(default_cargo_config_jobs {
+    let foo = project("foo")
+    .file("Cargo.toml", r#"
+        [package]
+        name = "foo"
+        version = "0.0.0"
+        authors = []
+    "#)
+    .file("src/lib.rs", "")
+    .file(".cargo/config", r#"
+        [build]
+        jobs = 1
+    "#);
+    assert_that(foo.cargo_process("build").arg("-v"),
+                execs().with_status(0));
+});
+
+test!(good_cargo_config_jobs {
+    let foo = project("foo")
+    .file("Cargo.toml", r#"
+        [package]
+        name = "foo"
+        version = "0.0.0"
+        authors = []
+    "#)
+    .file("src/lib.rs", "")
+    .file(".cargo/config", r#"
+        [build]
+        jobs = 4
+    "#);
+    assert_that(foo.cargo_process("build").arg("-v"),
+                execs().with_status(0));
+});